#pragma once

#include "IHandler.h"
#include <map>
#include <memory>
#include <vector>

/// <summary>
/// 一个集中的prototype管理器
/// </summary>
class HandlerRegister
{
public:	
	/// <summary>
	/// 获取一个合适的原型的复制品， std::shared_ptr用于管理复制品的生命周期
	/// </summary>
	/// <param name="command">命令关键字，用户查找合适的命令处理器</param>
	/// <returns></returns>
	std::shared_ptr<IHandler> GetHandler(const std::string& command) const;

	/// <summary>
	/// HandlerRegister是个singleton
	/// </summary>
	/// <returns></returns>
	static HandlerRegister& Instance();

	/// <summary>
	/// 获取全部命令列表
	/// </summary>
	/// <returns></returns>
	std::vector<std::string> GetCommandList() const;
private: // singleton模式的实现
	HandlerRegister() = default;
	~HandlerRegister() = default;
	HandlerRegister(const HandlerRegister&) = delete;
	const HandlerRegister& operator=(const HandlerRegister&) = delete;
private:
	void Register(const std::string& command, IHandler* prototype);
private:
	std::map<std::string, IHandler*> _prototypes;

	friend class HandlerProvider; // 允许此类访问私有方法
};

/// <summary>
/// 一个辅助类，用于登记prototype对象
/// </summary>
class HandlerProvider
{
public:
	/// <summary>
	/// 构造函数中登记IHandler prototype到HandlerRegister
	/// </summary>
	/// <param name="command"></param>
	/// <param name="handler"></param>
	HandlerProvider(const std::string& command, const IHandler& handler);
};